package com.seed.core.pojo;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.seed.core.enumeration.AccountType;
import com.seed.core.enumeration.Admin;

import java.util.stream.Stream;

public class Account {

    private AccountType type; // 账号类型
    private String value; // 账号
    private String tenantname; // 租户号
    private String loginId;

    public Account(String rawUsername) {
        if(StrUtil.isBlank(rawUsername)) throw new RuntimeException("账号不能为空");
        init(rawUsername);
    }

//    /**
//     * 将用户名转换为租户号和账号
//     * admin  --超级管理员登录，账号：admin
//     * zhangsan  --内部用户用户名登录, 账号：zhangsan
//     * yanfa: --内部用户用户号登录, 账号：yanfa
//     * :yy --租户用户名登录, 账号：yy, 租户名：yy
//     * :yy:lishi --租户用户用户名登录, 账号：lishi, 租户名：yy
//     * :yy:lili: --租户用户用户号登录, 账号：lili, 租户名：yy
//     * @param rawUsername: 原始用户名
//     * @return
//     */
//    private void init(String rawUsername) {
//        if(isAdmin(rawUsername)) {// 超级管理员登录
//            this.type = AccountType.admin;
//            this.value = Const.ADMIN;
//            this.loginId = Const.ADMIN;
//            return;
//        }
//
//        String COLON = Const.COLON;
//        rawUsername = rawUsername.replace("：", COLON);
//        if(rawUsername.startsWith(COLON)) { // 租户或租户用户登录
//            rawUsername = rawUsername.substring(1);
//            if(rawUsername.endsWith(COLON)) { // 用户号登录
//                rawUsername = rawUsername.substring(0, rawUsername.length() - 1);
//                if(rawUsername.contains(COLON)) { // 租户用户登录
//                    int pos = rawUsername.indexOf(COLON);
//                    this.type = AccountType.tenantUserCode;
//                    this.tenantname = rawUsername.substring(0, pos);
//                    this.value = rawUsername.substring(pos + 1); // 租户用户用户号登录
//                    this.loginId = COLON + rawUsername + COLON;
//                } else { // 租户登录
////                    this.type = AccountType.tenantname;
////                    this.tenantname = rawUsername;
////                    this.value = rawUsername; // 租户用户号登录
////                    this.loginId = COLON + rawUsername + COLON;
//                    throw new RuntimeException(String.format("不支持格式【%s】", COLON + rawUsername + COLON));
//                }
//            } else { // 用户名登录
//                if(rawUsername.contains(COLON)) { // 租户用户登录
//                    int pos = rawUsername.indexOf(COLON);
//                    this.type = AccountType.tenantUserUsername;
//                    this.tenantname = rawUsername.substring(0, pos);
//                    this.value = rawUsername.substring(pos + 1); // 租户用户用户名登录
//                    this.loginId = COLON + rawUsername;
//                } else { // 租户登录
//                    this.type = AccountType.tenantUsername;
//                    this.tenantname = rawUsername;
//                    this.value = rawUsername; // 租户用户号登录
//                    this.loginId = COLON + rawUsername;
//                }
//            }
//        } else {
//            if(rawUsername.endsWith(COLON)) { // 内部用户用户号登录
//                rawUsername = rawUsername.substring(0, rawUsername.length() - 1);
//                this.type = AccountType.userCode;
//                this.value = rawUsername; // 租户用户号登录
//                this.loginId = rawUsername + COLON;
//            } else { // 内部用户用户名登录
//                this.type = AccountType.userUsername;
//                this.value = rawUsername; // 租户用户号登录
//                this.loginId = rawUsername;
//            }
//        }
//    }

    /**
     * 将用户名转换为租户号和账号
     * admin  --超级管理员登录，账号：admin
     * zhangsan  --内部用户用户名登录, 账号：zhangsan
     * yanfa: --内部用户用户号登录, 账号：yanfa
     * :yy, :yy: --租户用户名登录, 账号：yy, 租户名：yy
     * yy:lishi, :yy:lishi --租户用户用户名登录, 账号：lishi, 租户名：yy
     * yy:lili:, :yy:lili: --租户用户用户号登录, 账号：lili, 租户名：yy
     * @param rawUsername: 原始用户名
     */
    private void init(String rawUsername) {
        String COLON = Const.COLON;
        rawUsername = rawUsername.replace("：", COLON);
        if(isAdmin(rawUsername)) {// admin  --超级管理员登录，账号：admin
            this.type = AccountType.admin;
            this.value = Const.ADMIN;
            this.loginId = Const.ADMIN;
            return;
        }

        if(!rawUsername.contains(COLON)) { // zhangsan  --内部用户用户名登录, 账号：zhangsan
            this.type = AccountType.userUsername;
            this.value = rawUsername;
            this.loginId = rawUsername;
            return;
        }

        String[] items = rawUsername.split(COLON);
        int len = items.length;
        if(rawUsername.endsWith(COLON)) {
            if (len == 1) { // yanfa: --内部用户用户号登录, 账号：yanfa
                this.type = AccountType.userCode;
                this.value = items[0];
                this.loginId = rawUsername;
            } else if(rawUsername.startsWith(COLON)) {
                if(len == 2) { // :yy: --租户用户名登录, 账号：yy, 租户名：yy
                    this.type = AccountType.tenantUsername;
                    this.tenantname = items[1];
                    this.value = items[1];
                    this.loginId = rawUsername.substring(1, rawUsername.length() - 1);
                } else { // :yy:lili: --租户用户用户号登录, 账号：lili, 租户名：yy
                    this.type = AccountType.tenantUserCode;
                    this.tenantname = items[1];
                    this.value = items[2];
                    this.loginId = rawUsername.substring(1);
                }
            } else  { // yy:lili: --租户用户用户号登录, 账号：lili, 租户名：yy
                this.type = AccountType.tenantUserCode;
                this.tenantname = items[0];
                this.value = items[1];
                this.loginId = rawUsername;
            }
        } else {
            if(len == 2) {
                if(StrUtil.isBlank(items[0])) { // :yy --租户用户名登录, 账号：yy, 租户名：yy
                    this.type = AccountType.tenantUsername;
                    this.tenantname = items[1];
                    this.value = items[1];
                    this.loginId = rawUsername;
                } else { // yy:lishi --租户用户用户名登录, 账号：lishi, 租户名：yy
                    this.type = AccountType.tenantUserUsername;
                    this.tenantname = items[0];
                    this.value = items[1];
                    this.loginId = rawUsername;
                }
            } else {
                // :yy:lishi --租户用户用户名登录, 账号：lishi, 租户名：yy
                this.type = AccountType.tenantUserUsername;
                this.tenantname = items[1];
                this.value = items[2];
                this.loginId = rawUsername.substring(1);
            }
        }
    }

    private boolean isAdmin(String rawUsername) {
        return Stream.of(Admin.values()).map(Enum::name).toList().contains(rawUsername.toLowerCase());
    }

    public static void main(String[] args) {
        String[] usernames = new String[]{"admin", "zhangsan", "yanfa:", ":yy", "yy:lishi", ":yy:", "yy:lili:", ":yy:lishi", ":yy:lili:"};
        for (String username: usernames) {
            Account account = new Account(username);
            System.out.println(JSONUtil.toJsonStr(account));
        }
    }

    public AccountType getType() {
        return type;
    }

    public void setType(AccountType type) {
        this.type = type;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getTenantname() {
        return tenantname;
    }

    public void setTenantname(String tenantname) {
        this.tenantname = tenantname;
    }

    public String getLoginId() {
        return loginId;
    }

    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }
}
